using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BanZuiCloudControlAgent.Utils.Logging;

namespace BanZuiCloudControlAgent.Utils.Common.Example
{
    /// <summary>
    /// CacheManager使用示例类，展示如何使用缓存管理器缓存各种类型的数据
    /// </summary>
    public class CacheManagerExample
    {
        private static readonly Logger _logger = LogManager.GetLogger(nameof(CacheManagerExample));

        /// <summary>
        /// 演示如何缓存简单类型数据
        /// </summary>
        public static void CacheSimpleTypeExample()
        {
            // 缓存字符串，默认过期时间10分钟
            CacheManager.Set("greeting", "你好，世界！");
            
            // 缓存数字，设置过期时间为5分钟
            CacheManager.Set("counter", 100, TimeSpan.FromMinutes(5));
            
            // 缓存布尔值，设置过期时间为30秒
            CacheManager.Set("isActive", true, TimeSpan.FromSeconds(30));
            
            // 获取缓存的值
            if (CacheManager.TryGet<string>("greeting", out string greeting))
            {
                _logger.Info($"从缓存获取到字符串: {greeting}");
            }
            
            if (CacheManager.TryGet<int>("counter", out int counter))
            {
                _logger.Info($"从缓存获取到数字: {counter}");
            }
            
            if (CacheManager.TryGet<bool>("isActive", out bool isActive))
            {
                _logger.Info($"从缓存获取到布尔值: {isActive}");
            }
        }
        
        /// <summary>
        /// 演示如何缓存复杂对象
        /// </summary>
        public static void CacheComplexObjectExample()
        {
            // 创建一个用户对象
            var user = new User
            {
                Id = 1001,
                Name = "张三",
                Email = "zhangsan@example.com",
                Roles = new List<string> { "管理员", "操作员" },
                LastLoginTime = DateTime.Now
            };
            
            // 缓存用户对象，设置过期时间为30分钟
            CacheManager.Set("currentUser", user, TimeSpan.FromMinutes(30));
            
            // 从缓存获取用户对象
            if (CacheManager.TryGet<User>("currentUser", out User cachedUser))
            {
                _logger.Info($"从缓存获取到用户: {cachedUser.Name}, 角色: {string.Join(", ", cachedUser.Roles)}");
            }
        }
        
        /// <summary>
        /// 演示如何使用GetOrAdd方法
        /// </summary>
        public static void GetOrAddExample()
        {
            // 获取或添加缓存项，如果不存在则执行工厂方法获取值
            string ipAddress = CacheManager.GetOrAdd("PublicIpAddress", () => 
            {
                _logger.Info("缓存不存在，正在获取公网IP地址...");
                return SystemInfo.GetPublicIpAddress();
            }, TimeSpan.FromMinutes(10));
            
            _logger.Info($"获取到的IP地址: {ipAddress}");
            
            // 再次获取，这次应该直接从缓存返回
            string cachedIp = CacheManager.GetOrAdd("PublicIpAddress", () => 
            {
                _logger.Info("这条日志不应该显示，因为缓存应该存在");
                return SystemInfo.GetPublicIpAddress();
            });
            
            _logger.Info($"再次获取到的IP地址（应该来自缓存）: {cachedIp}");
        }
        
        /// <summary>
        /// 演示如何缓存系统信息报告
        /// </summary>
        public static void CacheSystemReportExample()
        {
            // 获取或添加系统状态报告
            var report = CacheManager.GetOrAdd("SystemStatusReport", () => 
            {
                _logger.Info("生成系统状态报告...");
                return SystemInfo.GenerateStatusReport();
            }, TimeSpan.FromMinutes(5));
            
            _logger.Info($"系统报告时间: {report.ReportTime}, CPU使用率: {report.CpuUsage}%, 内存使用率: {report.MemoryUsagePercentage}%");
        }
        
        /// <summary>
        /// 演示缓存清理
        /// </summary>
        public static void CacheCleanupExample()
        {
            // 添加一些缓存项
            CacheManager.Set("temp1", "临时数据1", TimeSpan.FromSeconds(3));
            CacheManager.Set("temp2", "临时数据2", TimeSpan.FromSeconds(3));
            
            _logger.Info($"当前缓存项数量: {CacheManager.Count()}");
            
            // 等待5秒，让缓存项过期
            _logger.Info("等待5秒，让缓存项过期...");
            System.Threading.Thread.Sleep(5000);
            
            // 尝试获取过期的缓存项
            if (!CacheManager.TryGet<string>("temp1", out _))
            {
                _logger.Info("temp1已过期");
            }
            
            // 手动移除缓存项
            if (CacheManager.Remove("currentUser"))
            {
                _logger.Info("手动移除了currentUser缓存项");
            }
            
            // 清空所有缓存
            CacheManager.Clear();
            _logger.Info($"清空后的缓存项数量: {CacheManager.Count()}");
        }
    }
    
    /// <summary>
    /// 用于演示的用户类
    /// </summary>
    public class User
    {
        /// <summary>
        /// 用户ID
        /// </summary>
        public int Id { get; set; }
        
        /// <summary>
        /// 用户名称
        /// </summary>
        public string Name { get; set; }
        
        /// <summary>
        /// 用户邮箱
        /// </summary>
        public string Email { get; set; }
        
        /// <summary>
        /// 用户角色列表
        /// </summary>
        public List<string> Roles { get; set; }
        
        /// <summary>
        /// 最后登录时间
        /// </summary>
        public DateTime LastLoginTime { get; set; }
    }
} 